From: RafaelGSS Date: Sun, 19 Jul 2026 14:38:25 +0000 (-0300) Subject: [PATCH] dns: handle large resolveAny address replies X-Git-Tag: archive/raspbian/18.20.4+dfsg-1_deb12u3+rpi1^2~3 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=7b8094d2aa8310338ba31050453d5d2fdec5e2f7;p=nodejs.git [PATCH] dns: handle large resolveAny address replies Refs: https://hackerone.com/reports/3795657 Signed-off-by: RafaelGSS PR-URL: https://github.com/nodejs-private/node-private/pull/929 Reviewed-By: Matteo Collina CVE-ID: CVE-2026-58042 [backport] - remove test that fail due to lack of EDNS by default on node18 Gbp-Pq: Topic sec Gbp-Pq: Name CVE-2026-58042.patch --- diff --git a/src/cares_wrap.cc b/src/cares_wrap.cc index 8b0373563..8ea51bbba 100644 --- a/src/cares_wrap.cc +++ b/src/cares_wrap.cc @@ -40,6 +40,10 @@ #include #include +#ifndef T_TLSA +#define T_TLSA 52 /* TLSA certificate association */ +#endif + #ifndef T_CAA # define T_CAA 257 /* Certification Authority Authorization */ #endif @@ -198,6 +202,23 @@ Local AddrTTLToArray( return Array::New(env->isolate(), ttls.out(), naddrttls); } +int GetAnswerCountForTTLBuffer(const unsigned char* buf, int len) { + static constexpr int kDNSAnswerCountOffset = 6; + static constexpr int kAresDefaultTTLBufferLength = 256; + if (len <= kDNSAnswerCountOffset + 1) { + return kAresDefaultTTLBufferLength; + } + + const int answer_count = (static_cast(buf[kDNSAnswerCountOffset]) << 8) | + static_cast(buf[kDNSAnswerCountOffset + 1]); + return answer_count == 0 ? 1 : answer_count; +} + +template +std::vector MakeAddrTTLBuffer(const unsigned char* buf, int len) { + return std::vector(GetAnswerCountForTTLBuffer(buf, len)); +} + int ParseGeneralReply( Environment* env, const unsigned char* buf, @@ -905,8 +926,9 @@ int AnyTraits::Parse( int type, status, old_count; /* Parse A records or CNAME records */ - ares_addrttl addrttls[256]; - int naddrttls = arraysize(addrttls); + std::vector addrttls = + MakeAddrTTLBuffer(buf, len); + int naddrttls = static_cast(addrttls.size()); type = ns_t_cname_or_a; status = ParseGeneralReply(env, @@ -914,7 +936,7 @@ int AnyTraits::Parse( len, &type, ret, - addrttls, + addrttls.data(), &naddrttls); uint32_t a_count = ret->Length(); if (status != ARES_SUCCESS && status != ARES_ENODATA) @@ -950,8 +972,9 @@ int AnyTraits::Parse( } /* Parse AAAA records */ - ares_addr6ttl addr6ttls[256]; - int naddr6ttls = arraysize(addr6ttls); + std::vector addr6ttls = + MakeAddrTTLBuffer(buf, len); + int naddr6ttls = static_cast(addr6ttls.size()); type = ns_t_aaaa; status = ParseGeneralReply(env, @@ -959,7 +982,7 @@ int AnyTraits::Parse( len, &type, ret, - addr6ttls, + addr6ttls.data(), &naddr6ttls); uint32_t aaaa_count = ret->Length() - a_count; if (status != ARES_SUCCESS && status != ARES_ENODATA) @@ -1068,8 +1091,9 @@ int ATraits::Parse( HandleScope handle_scope(env->isolate()); Context::Scope context_scope(env->context()); - ares_addrttl addrttls[256]; - int naddrttls = arraysize(addrttls), status; + std::vector addrttls = + MakeAddrTTLBuffer(buf, len); + int naddrttls = static_cast(addrttls.size()), status; Local ret = Array::New(env->isolate()); int type = ns_t_a; @@ -1078,12 +1102,12 @@ int ATraits::Parse( len, &type, ret, - addrttls, + addrttls.data(), &naddrttls); if (status != ARES_SUCCESS) return status; - Local ttls = AddrTTLToArray(env, addrttls, naddrttls); + Local ttls = AddrTTLToArray(env, addrttls.data(), naddrttls); wrap->CallOnComplete(ret, ttls); return ARES_SUCCESS; @@ -1102,8 +1126,9 @@ int AaaaTraits::Parse( HandleScope handle_scope(env->isolate()); Context::Scope context_scope(env->context()); - ares_addr6ttl addrttls[256]; - int naddrttls = arraysize(addrttls), status; + std::vector addrttls = + MakeAddrTTLBuffer(buf, len); + int naddrttls = static_cast(addrttls.size()), status; Local ret = Array::New(env->isolate()); int type = ns_t_aaaa; @@ -1112,12 +1137,12 @@ int AaaaTraits::Parse( len, &type, ret, - addrttls, + addrttls.data(), &naddrttls); if (status != ARES_SUCCESS) return status; - Local ttls = AddrTTLToArray(env, addrttls, naddrttls); + Local ttls = AddrTTLToArray(env, addrttls.data(), naddrttls); wrap->CallOnComplete(ret, ttls); return ARES_SUCCESS;